#pragma once

#include <QString>
#include <QMap>

#include <windows.h>

struct HookInfo {
    void *OldFuncAddr = 0;
    void *NewFuncAddr = 0;
    BYTE NewCode[5] = { 0xE9, 0x0, 0x0, 0x0, 0x0 };  // 新代码，用于Hook
    BYTE OldCode[5] = { 0 };                                     // 旧代码，用于保存被Hook函数的原始字节
};

class Hook
{
public:
    explicit Hook();
    virtual ~Hook();

    void HookJmp(void *oldFuncAddr, void *newFuncAddr);
    void CloseHookJmp(void *oldFuncAddr);
    void LibFuncHookJmp(const QString &libName, const QString &funcName, void *newFuncAddr);
    void CloseLibFuncHookJmp(const QString &libName, const QString &funcName);

private:

private:
    QMap<void *, HookInfo> m_mapOfFuncAddrToHookInfo;
};


